package com.hyg.module_report.adapter;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.hyg.lib_base.mainUtils.NumberFormatUtil;
import com.hyg.module_report.R;
import com.hyg.module_report.databinding.ItemPulsedataV2Binding;
import com.hyg.module_report.model.HealthReportDetailData;
import com.hyg.module_report.model.V2PulseData;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: Administrator
 * @date: 2020/12/30
 */
public class V2MaiXingAdapter extends RecyclerView.Adapter<V2MaiXingAdapter.MaiXingViewHolder> {
    Context context;
    List<V2PulseData.PulseDataListDTO> dataList;
    ItemPulsedataV2Binding binding;
//    private ArrayList<Entry> continuity_chart = new ArrayList<Entry>();

    public V2MaiXingAdapter(Context context, List<V2PulseData.PulseDataListDTO> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @NonNull
    @Override
    public MaiXingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pulsedata_v2, parent, false);
        MaiXingViewHolder holder = new MaiXingViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull V2MaiXingAdapter.MaiXingViewHolder holder, int position) {
        V2PulseData.PulseDataListDTO data = dataList.get(position);
        if (binding == null) {
            return;
        }
        String mark = data.getPulseHand().contains("手") ? "\n" : "手\n";
        binding.maiquweizhi.setText(data.getPulseHand() + mark + data.getPulsePos() + "位\n" + data.getPulsePressureType());
        binding.maili.setText(data.getPulseForce());
        binding.liulidu.setText(data.getFluency());
        binding.jinzhangdu.setText(data.getTensionDegree());
        binding.mailv.setText(Integer.parseInt(data.getPulseRate()) + "");
        binding.jielvjunyundu.setText(data.getPfu());
        binding.mailijunyundu.setText(data.getSru());
        binding.pulseNumber.setText("脉象图采集 (" + NumberFormatUtil.formatInteger(position + 1) + ")");
        initLinChart(data, binding.pulseContinuityChart);
        initLinChart2(data, binding.pulseOptimumChart);
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    class MaiXingViewHolder extends RecyclerView.ViewHolder {
        private TextView zonghezhenduan, maizhenduantishi;
        //        private String MaiType = "";
        private RecyclerView RV_pulseDatas;
        private PulseDataAdapter pulseDataAdapter;

        public MaiXingViewHolder(View view_mai) {
            super(view_mai);
            binding = ItemPulsedataV2Binding.bind(view_mai);
        }
    }


    public void initLinChart(V2PulseData.PulseDataListDTO data, LineChart lineChart) {
        int limit = 0;
        limit = data.getEndIndex() - data.getStartIndex();
        ArrayList<Entry> continuity_chart = new ArrayList<Entry>();
//        ArrayList<Entry> continuity_chart = new ArrayList<Entry>();
//            //创建RxAndroid线程
//            Observable.create(new ObservableOnSubscribe<byte[]>() {
//                @Override
//                public void subscribe(final ObservableEmitter<byte[]> subscriber) throws Exception {
//                    Log.d("pulse", "subscribe");
        lineChart.setDrawGridBackground(false);
        Description description = new Description();
        description.setText("");
        lineChart.setDescription(description);//添加图线描述

        lineChart.setTouchEnabled(true);//默认可触摸
        lineChart.setDragEnabled(true);// 是否可以拖拽
        lineChart.setScaleEnabled(false);// 是否可以缩放 x和y轴, 默认是true
        lineChart.setScaleXEnabled(false); //是否可以缩放 仅x轴
        lineChart.setScaleYEnabled(false); //是否可以缩放 仅y轴
        lineChart.setPinchZoom(false); //设置x轴和y轴能否同时缩放。默认是否
        lineChart.setDoubleTapToZoomEnabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
        lineChart.setHighlightPerDragEnabled(false);//能否拖拽高亮线(数据点与坐标的提示线)，默认是true
        lineChart.setDragDecelerationEnabled(true);//拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
        lineChart.setDragDecelerationFrictionCoef(0.99f);//与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止。
        lineChart.zoomToCenter(1.4f, 1f);

        XAxis xAxis = lineChart.getXAxis();//获取x轴
        //xAxis.setDrawAxisLine(true);//绘制X轴，默认为true
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);//设置x轴位置，有四个属性。可以说是上下两个位置，只不过轴标签分为轴线内外，感兴趣的可以自己试试
        //禁用x轴，设置为false后该轴任何部分都不会绘制,所以即使再设置xAxis.setDrawAxisLine(true);也不会被绘制
        //xAxis.setEnabled(false);
        xAxis.setDrawGridLines(false);//绘制网格线，默认为true
        xAxis.setDrawAxisLine(false);//则绘制该行旁边的轴线（axis-line）
        xAxis.setGridColor(Color.parseColor("#000000"));//设置该轴的网格线颜色。
        xAxis.setGridLineWidth(0.4f);// 设置该轴网格线的宽度。
        xAxis.setDrawLabels(false);//绘制该轴标签
        xAxis.setTextColor(Color.RED);// 设置轴标签的颜色。
        xAxis.setTextSize(11f);//设置轴标签的文字大小。
        xAxis.setAxisLineColor(Color.parseColor("#000000"));
        xAxis.setAxisLineWidth(0.4f);
//        xAxis.setValueFormatter(new IAxisValueFormatter() {
//            @Override
//            public String getFormattedValue(float value, AxisBase axis) {
//                int i = (int) value;
//                return "数据" + i;
//            }
//        });
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                int i = (int) value;
                return "数据" + i;
            }
        });
        if (data.getPulsePressureType().contains("沉")) {
            continuity_chart.addAll(getStringList(data.getData2()));
        } else if (data.getPulsePressureType().contains("中")) {
            continuity_chart.addAll(getStringList(data.getData1()));
        } else {
            continuity_chart.addAll(getStringList(data.getData0()));
        }
        LineDataSet dataSet = new LineDataSet(continuity_chart, "连续脉图");
        dataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
        dataSet.setHighLightColor(Color.RED); // 设置点击某个点时，横竖两条线的颜色
        dataSet.setDrawValues(false);//在点上显示数值 默认true
        dataSet.setCircleRadius(1f);
        dataSet.setCircleColor(context.getResources().getColor(R.color.transparent));// 圆形的颜色
        dataSet.setHighLightColor(context.getResources().getColor(R.color.transparent)); // 高亮的线的颜色
        dataSet.setColor(context.getResources().getColor(R.color.view1_top_bg));
        dataSet.setLineWidth(1.5f); // 线宽
        dataSet.setCubicIntensity(15f);//曲线的平滑度，值越大越平滑。
        dataSet.setDrawFilled(true);   //设置 线下区域颜色填充 为空
        GradientDrawable aDrawable = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                new int[]{Color.parseColor("#E6F4FF"), Color.parseColor("#ffffff")});
        dataSet.setFillDrawable(aDrawable);
        //            dataSet.setColor(context.getResources().getColor(R.color.gradient_blue));// 显示颜色
        dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);//立方化，俗称圆润化
        //        dataSet.setValueTextSize(12f);//数值字体大小，同样可以设置字体颜色、自定义字体等
        LineData lineData = new LineData(dataSet);
        lineChart.setData(lineData);
        YAxis leftAxis = lineChart.getAxisLeft();//获取左轴
        lineChart.getAxisRight().setEnabled(false);//隐藏右轴  默认显示
        lineChart.getAxisLeft().setEnabled(true);//隐藏右轴  默认显示
        leftAxis.setDrawLabels(false);//设置是否显示Y轴的值
        leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
        leftAxis.setDrawGridLines(true);//设置所有垂直Y轴的的网格线是否显示
        leftAxis.enableGridDashedLine(15f, 15f, 0f);//设置虚线
        leftAxis.setDrawZeroLine(false);
        //            leftAxis.setDrawAxisLine(false);
        leftAxis.setGridColor(Color.parseColor("#dddddd"));//设置该轴的网格线颜色。
        leftAxis.setGridLineWidth(1f);// 设置该轴网格线的宽度。
        //设置Y轴最大最小值，不设置chart会自己计算
        //            leftAxis.setAxisMinimum(5000f);//设置最小值
        //            leftAxis.setAxisMaximum(25000f);//设置最大值
        lineChart.setMinOffset(5);//设置填充属性,类似与padding的效果
//                    lineChart.animateXY(1000,0);//默认动画
        Legend l = lineChart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        //            l.setVerticalAlignment(Legend.LegendVerticalAlignment.CENTER);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setWordWrapEnabled(true);
        l.setDrawInside(false);
        l.setTextSize(16f);
        l.setXEntrySpace(0f);
        l.setYEntrySpace(7f);
        l.setYOffset(0f);
        l.setEnabled(false);
        // 输入标签样式 文本文字大小颜色
//                    subscriber.onComplete();
//                }
//            }).subscribeOn(Schedulers.io())//指定数据发射(上方的subscribe方法)在哪个线程执行
//                    .observeOn(AndroidSchedulers.mainThread())//observeOn方法决定他下面的方法执行在哪个线程中
//                    .subscribe(new Observer<byte[]>() {
//                        @Override
//                        public void onError(Throwable e) {
//                        }
//                        @Override
//                        public void onComplete() {

        lineChart.invalidate();
//                        }
//                        @Override
//                        public void onSubscribe(Disposable d) {
//                        }
//                        @Override
//                        public void onNext(byte[] res) {
//                        }
//                    });
    }


    public void initLinChart2(V2PulseData.PulseDataListDTO data, LineChart lineChart) {
        /*开启线程操作，导致部分手机一直延迟，显示不出来*/
//            //创建RxAndroid线程
//            Observable.create(new ObservableOnSubscribe<byte[]>() {
//                @Override
//                public void subscribe(final ObservableEmitter<byte[]> subscriber) throws Exception {
//                    Log.d("pulse", "subscribe");
        lineChart.setDrawGridBackground(false);
        Description description = new Description();
        description.setText("");
        lineChart.setDescription(description);//添加图线描述
        ArrayList<Entry> continuity_chart = new ArrayList<Entry>();

        lineChart.setTouchEnabled(false);//默认可触摸
        lineChart.setDragEnabled(false);// 是否可以拖拽
        lineChart.setScaleEnabled(false);// 是否可以缩放 x和y轴, 默认是true
        lineChart.setScaleXEnabled(false); //是否可以缩放 仅x轴
        lineChart.setScaleYEnabled(false); //是否可以缩放 仅y轴
        lineChart.setPinchZoom(false); //设置x轴和y轴能否同时缩放。默认是否
        lineChart.setDoubleTapToZoomEnabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
        lineChart.setHighlightPerDragEnabled(false);//能否拖拽高亮线(数据点与坐标的提示线)，默认是true
        lineChart.setDragDecelerationEnabled(true);//拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
        lineChart.setDragDecelerationFrictionCoef(0.99f);//与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止。

        XAxis xAxiss = lineChart.getXAxis();//获取x轴
        //xAxis.setDrawAxisLine(true);//绘制X轴，默认为true
        xAxiss.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);//设置x轴位置，有四个属性。可以说是上下两个位置，只不过轴标签分为轴线内外，感兴趣的可以自己试试
        //禁用x轴，设置为false后该轴任何部分都不会绘制,所以即使再设置xAxis.setDrawAxisLine(true);也不会被绘制
        //            xAxiss.setEnabled(false);
        xAxiss.setDrawGridLines(false);//绘制网格线，默认为true
        xAxiss.setDrawAxisLine(false);//则绘制该行旁边的轴线（axis-line）
        xAxiss.setGridColor(Color.GRAY);//设置该轴的网格线颜色。
        xAxiss.setGridLineWidth(1f);// 设置该轴网格线的宽度。
        xAxiss.setDrawLabels(false);//绘制该轴标签
        xAxiss.setTextColor(Color.RED);// 设置轴标签的颜色。
        xAxiss.setTextSize(11f);//设置轴标签的文字大小。
        xAxiss.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                int i = (int) value;
                return "数据" + i;
            }
        });
        if (data.getPulsePressureType().contains("沉")) {
            continuity_chart.addAll(getStringList(data.getData2()));
        } else if (data.getPulsePressureType().contains("中")) {
            continuity_chart.addAll(getStringList(data.getData1()));
        } else {
            continuity_chart.addAll(getStringList(data.getData0()));
        }
        ArrayList<Entry> spoitList = new ArrayList<Entry>();
        if (data.getStartIndex() > 1 && data.getEndIndex() > 1 && data.getStartIndex() < data.getEndIndex() && data.getEndIndex() <= continuity_chart.size()) {
            for (int i = data.getStartIndex(); i < data.getEndIndex(); i++) {
                spoitList.add(new Entry(i, continuity_chart.get(i).getY()));
            }
        } else {
            spoitList.add(new Entry(0, 0));
        }

        LineDataSet dataSets = new LineDataSet(spoitList, "最佳脉图");
        dataSets.setAxisDependency(YAxis.AxisDependency.LEFT);
        dataSets.setDrawValues(false);//在点上显示数值 默认true
        dataSets.setCircleRadius(1f);
        dataSets.setCircleColor(context.getResources().getColor(R.color.transparent));// 圆形的颜色
        dataSets.setHighLightColor(context.getResources().getColor(R.color.gradient_Violet)); // 高亮的线的颜色// 设置点击某个点时，横竖两条线的颜色
        dataSets.setDrawFilled(true);
        dataSets.setCubicIntensity(10f);//曲线的平滑度，值越大越平滑。
        GradientDrawable aDrawables = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                new int[]{Color.parseColor("#E6F4FF"), Color.parseColor("#ffffff")});
        dataSets.setFillDrawable(aDrawables);    //
        dataSets.setColor(context.getResources().getColor(R.color.gradient_Violet));// 显示颜色
        dataSets.setLineWidth(1.75f); // 线宽
        dataSets.setMode(LineDataSet.Mode.CUBIC_BEZIER);//立方化，俗称圆润化
        //        dataSet.setValueTextSize(12f);//数值字体大小，同样可以设置字体颜色、自定义字体等
        LineData datas = new LineData(dataSets);

        lineChart.setData(datas);
        YAxis leftAxiss = lineChart.getAxisLeft();//获取左轴
        lineChart.getAxisRight().setEnabled(false);//隐藏右轴  默认显示
        lineChart.getAxisLeft().setEnabled(false);//隐藏右轴  默认显示
        leftAxiss.setDrawGridLines(false);//绘制网格线 默认为true
        leftAxiss.setGridColor(Color.GRAY);//设置该轴的网格线颜色。
        leftAxiss.setGridLineWidth(1f);// 设置该轴网格线的宽度。
        //设置Y轴最大最小值，不设置chart会自己计算
        //            leftAxiss.setAxisMinimum(0f);//设置最小值
        //            leftAxiss.setAxisMaximum(100f);//设置最大值
        //默认动画
//                    lineChart.animateXY(1000,0);
        lineChart.setMinOffset(1);//设置填充属性,类似与padding的效果
        Legend lg = lineChart.getLegend();
        lg.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        //            l.setVerticalAlignment(Legend.LegendVerticalAlignment.CENTER);
        lg.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        lg.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        lg.setWordWrapEnabled(true);
        lg.setDrawInside(false);
        lg.setTextSize(18f);
        lg.setXEntrySpace(0f);
        lg.setYEntrySpace(7f);
        lg.setYOffset(0f);
        //            lg.setEnabled(false);
        // 输入标签样式 文本文字大小颜色
//                    subscriber.onComplete();
//                }
//            }).subscribeOn(Schedulers.io())//指定数据发射(上方的subscribe方法)在哪个线程执行
//                    .observeOn(AndroidSchedulers.mainThread())//observeOn方法决定他下面的方法执行在哪个线程中
//                    .subscribe(new Observer<byte[]>() {
//                        @Override
//                        public void onError(Throwable e) {
//                        }
//                        @Override
//                        public void onComplete() {
        lineChart.invalidate();
//                        }
//                        @Override
//                        public void onSubscribe(Disposable d) {
//                        }
//                        @Override
//                        public void onNext(byte[] res) {
//
//                        }
//                    });

//        // 如果设置了回调，则设置点击事件
//        if (mOnItemClickLitener != null) {
//            itemView.setOnClickListener(new View.OnClickListener() {
//                @Override
//                public void onClick(View v) {
//                    int pos = getLayoutPosition();
//                    mOnItemClickLitener.onItemClick(itemView, pos);
//                    //                    Toast.makeText(context,""+pos,Toast.LENGTH_SHORT).show();
//                }
//            });
//
//            itemView.setOnLongClickListener(new View.OnLongClickListener() {
//                @Override
//                public boolean onLongClick(View v) {
//                    int pos = getLayoutPosition();
//                    mOnItemClickLitener.onItemLongClick(itemView, pos);
//                    return false;
//                }
//            });
//        }
    }


    public ArrayList<Entry> getStringList(String string) {
        ArrayList<Entry> Arraydatas = new ArrayList<Entry>();
        if (TextUtils.isEmpty(string)) return Arraydatas;
        String[] datas0 = string.split(",");
        for (int k = 0; k < datas0.length; k++) {
            Arraydatas.add(new Entry(k, Integer.parseInt(datas0[k])));
        }
        return Arraydatas;
    }



}
